//
//  ACCalendarManager.h
//  ACFramework
//
//  Created by caoyq on 2107/12/19.
//  Updated by caoyq on 2018/5/7.
//
//  公历时间比北京时间早8小时（UTC：16:00:00 Chines：24:00:00）
//

#import <Foundation/Foundation.h>

///日历时间类型
typedef NS_ENUM(NSInteger, ACCalendarType){
    ACCalendarTypeYear = 0,
    ACCalendarTypeMonth,
    ACCalendarTypeDay,
    ACCalendarTypeHour,
    ACCalendarTypeMinute,
    ACCalendarTypeSecond
};

typedef NS_ENUM(NSInteger, ACCalendarFormatType)
{
    ACCalendarFormatTypeAll = 0,  /**< yyyy-MM-dd HH:mm:ss */
    ACCalendarFormatTypeYMD,      /**< yyyy-MM-dd */
    ACCalendarFormatTypeHMS,      /**< HH:mm:ss */
    ACCalendarFormatTypeYMDHM     /**< yyyy-MM-dd HH:mm */
};

///自定义的日历、时间管理类，统一处理时间的问题
@interface ACCalendarManager : NSObject

/** 当前年份 */
@property (nonatomic, assign) NSInteger curYear;
/** 当前月份 */
@property (nonatomic, assign) NSInteger curMonth;
/** 当前天数 */
@property (nonatomic, assign) NSInteger curDay;
/** 当前时 */
@property (nonatomic, assign) NSInteger curHour;
/** 当前分 */
@property (nonatomic, assign) NSInteger curMinute;
/** 当前秒 */
@property (nonatomic, assign) NSInteger curSecond;
/** 当前星期几  周日开始 为 1 */
@property (nonatomic, assign) NSInteger curWeekday;
/** 本周是本月的第几周 */
@property (nonatomic, assign) NSInteger curWeekOfMonth;
/** 本周是本年的第几周 */
@property (nonatomic, assign) NSInteger curWeekOfYear;

///初始化单例和一个公历日历
+ (instancetype)gregorian;

#pragma mark - 获取天数

///当前月份有多少天
- (NSInteger)numberOfDaysInCurrentMonth;
///根据date得到该月的天数
- (NSInteger)numberOfDaysInDate: (NSDate *)date;

#pragma mark - 获取date

/// 根据时间戳（秒为单位 since 1970） 得到对应的 date属性
- (NSDate *)dateWithTimeStamp: (NSTimeInterval)timeStamp;

///获取当前月份第一天的date属性
- (NSDate *)dateOfFirstDayInCurrentMonth;
///获取当前月份最后一天的date属性
- (NSDate *)dateOfLastDayInCurrentMonth;
///根据date得到该月第一天的date属性
- (NSDate *)dateOfFirstDayInDate: (NSDate *)date;
///根据date得到该月最后一天的date属性
- (NSDate *)dateOfLastDayInDate: (NSDate *)date;

///根据date 得到对应的上个月同一天的date属性
- (NSDate *)dateOfPreviousMonthInDate: (NSDate *)date;
///根据date 得到对应的下个月同一天的date属性
- (NSDate *)dateOfNextMonthInDate: (NSDate *)date;

#pragma mark - 获取星期几

///当前月的第一天是星期几
- (NSInteger)indexOfWeekWithFirstDayInCurrentMonth;
///根据传入的date，得到date是星期几（起始星期天记为0）
- (NSInteger)indexOfWeekWithDate: (NSDate *)date;

#pragma mark - 时间戳

/**
 日期字符串转化为时间戳

 @param dateString 日期字符串
 @param formatType 字符串格式
 @return 时间戳，单位秒
 */
+ (NSTimeInterval)timeStampFromDateString: (NSString *)dateString formatType: (ACCalendarFormatType)formatType;

/**
 日期转化为时间戳

 @param date 日期
 @return 时间戳，单位秒
 */
+ (NSTimeInterval)timeStampFromDate: (NSDate *)date;

#pragma mark - 获取日期时间字符串

/**
 date 转化为 string.

 @param date   NSDate 实例
 @param format 日期字符串格式，如：@"yyyy-MM-dd HH:mm" ...
 @return  object of NSString.
 */
- (NSString *)stringWithDate: (NSDate *)date format: (NSString *)format;

/**
 时间戳（秒）转化为 日期字符串

 @param timeStamp 时间戳 （秒为单位）
 @param format 日期格式 如：@"yyyy-MM-dd HH:mm:ss"
 @return intance of NSString.
 */
- (NSString *)stringFromTimestamp: (NSTimeInterval)timeStamp format: (NSString *)format;

/**
 时间戳转化为倒计时样式显示
 
 倒计时和正常显示的时间在时区上有所区别.

 @param timeStamp 时间戳 （秒为单位）
 @param format 倒计时格式 如： HH:mm:ss
 @return intance of NSString.
 */
- (NSString *)timerStringFromTimestamp: (NSTimeInterval)timeStamp format: (NSString *)format;

#pragma mark - 比较时间

/**
 比较两个时间，得到字符串差值.
 
 比较成分：年、月、日、时、分、秒.
 
 结果显示：1年2个月3天4小时5分6秒.

 @param startingDate 开始时间
 @param resultDate 结束时间
 @return an instance of NSString.
 */
- (NSString *)compareFromDate: (NSString *)startingDate toDate: (NSString *)resultDate;

/**
 比较两个时间的大小

 @param fromDate 时间字符串
 @param toDate  时间字符串
 @param formatType 字符串格式
 @return 返回值：1(toDate较大), 0(两者相等), -1(fromDate较大)
 */
+ (NSInteger)compareFromDate: (NSString *)fromDate toDate: (NSString *)toDate  formatType: (ACCalendarFormatType)formatType;

#pragma mark - 友好时间显示

/**
 同当前时间作对比，友好地显示过去的某个时间.
 
 @return e.g. 3秒前、5分钟前、8小时前、2012-12-25.
 */
+ (NSString *)friendlyDisplayPastTime: (NSString *)pastTime;

#pragma mark - 写入事件到系统日历中

/**
 写入自定义事件到系统日历中. 默认在事件开始前5分钟提醒一次.

 @param title      标题
 @param location   位置
 @param startDate  开始时间
 @param endDate    结束时间
 @param notes      备注
 @param completion 是否写入成功的回调
 */
+ (void)writeEventToCalendarWithTitle: (NSString *)title location: (NSString *)location startDate: (NSDate *)startDate endDate: (NSDate *)endDate notes: (NSString *)notes completion: (void (^)(NSError *error))completion;

@end
